class_name StateMachine
extends Node
signal state_changed(name: String)

@export var initial_node_state : NodeState # 节点的初始状态（进入场景后立即执行该状态的 _on_enter）

var node_states : Dictionary = {} # 状态名(小写)->状态节点 映射
var current_node_state : NodeState # 当前状态节点
var current_node_state_name : String # 当前状态名称（小写，便于匹配）
var parent_node_name: String # 用于调试输出的父节点名


func _ready() -> void: # 初始化：收集子状态并建立信号连接
	parent_node_name = get_parent().name
	
	for child in get_children():
		if child is NodeState:
			node_states[child.name.to_lower()] = child # 统一用小写键避免大小写差异
			child.transition.connect(transition_to) # 每个状态发出的 transition 信号由状态机处理
	
	if initial_node_state:
		initial_node_state._on_enter() # 进入初始状态
		current_node_state = initial_node_state
		current_node_state_name = current_node_state.name.to_lower()
		state_changed.emit(current_node_state.name)


func _process(delta : float) -> void: # 转发帧逻辑到当前状态
	if current_node_state:
		current_node_state._on_process(delta)


func _physics_process(delta: float) -> void: # 转发物理帧逻辑与状态自检/切换
	if current_node_state:
		current_node_state._on_physics_process(delta)
		current_node_state._on_next_transitions()
		#print(parent_node_name, " Current State: ", current_node_state_name)


func transition_to(node_state_name : String) -> void: # 切换到指定状态名（不区分大小写）
	if node_state_name == current_node_state.name.to_lower():
		return
	
	var new_node_state = node_states.get(node_state_name.to_lower())
	
	if !new_node_state:
		return
	
	if current_node_state:
		current_node_state._on_exit() # 退出当前状态
	
	new_node_state._on_enter()
	
	current_node_state = new_node_state
	current_node_state_name = current_node_state.name.to_lower()
	state_changed.emit(current_node_state.name)
	#print("Current State: ", current_node_state_name)
